﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Demo4
{
    /// <summary>
    /// 编写实现画各种简单图型的方法
    /// </summary>
    class Program
    {
        static void Main(string[] args)
        {
            // 设置光标的起始位置，left左边距，top上边距
            //Console.SetCursorPosition(15, 20);
            //Console.Write("**********");
            //Console.WriteLine();

            //Console.SetCursorPosition(15, 21);
            //for (int i=0;i<10;i++)
            //    Console.Write("*");
            //Console.WriteLine();

            //// 使用控制光标位置的方法来输出*
            //for (int j = 0; j < 10; j++)
            //{
            //    Console.SetCursorPosition(10 + j, 10+j);
            //    Console.Write("*");
            //}

            //DrawCircle(15, 10,10);
            //DrawLine(0, 0, 2, 5);
            DrawRectAngle(5, 5, 10, 6);

            Console.ReadKey();
        }

        static  void DrawCircle(int x,int y,int r)
        {
            int r2 = r * r;
            //dx dy表示为横纵坐标的变化范围
            for(int dy=-r;dy<= r;dy++)
            {
                for(int dx=-r;dx<= r;dx++)
                {
                    // 利用勾股定理判定是否在圆的范围内输出*
                    if(dy+dy+dx*dx<=r2)
                    {
                        Console.SetCursorPosition(x+dx,y+dy);
                        Console.Write("*");
                    }
                }
            }
        }

        /// <summary>
        /// 计算机中如何画直线
        /// 当前点(x0,y0),它的下一个点可能是(x0+1,y0)或(x0+1,y0+1)
        /// 取决于哪个点更靠近直线
        /// </summary>
        /// <param name="x1">开始的x坐标</param>
        /// <param name="y1">开始的y坐标</param>
        /// <param name="x2">结束的x坐标</param>
        /// <param name="y2">结束的y坐标</param>
        static void DrawLine(int x1,int y1,int x2,int y2)
        {
            // 定义变量，用来表示x,y的增量,增量用绝对值表示  Math数学类库
            int dx = Math.Abs(x2 - x1);
            int dy = Math.Abs(y2 - y1);
            // 方向的处理  水平向右用正号  垂直向上用正号 方向situation
            int sx = (x1 < x2) ? 1 : -1;
            int sy = (y1 < y2) ? 1 : -1;
            //判定的依据
            int err = dx - dy;

            while (true)
            {
                // 迭代x1,y1，直到x1=x2,y1=y2
                Console.SetCursorPosition(x1, y1);
                Console.Write("*");
                // 当x1 = x2,y1 = y2,则迭代结束
                if (x1 == x2 && y1 == y2)
                    break;

                // 判断是(x1+1,y1)或(x1+1,y1+1),更新x1,y1
                int e2 = err * 2;
                // 如果dx小于dy，那err和e2都会是负数
                // 算法的核心部分，判断下一步是沿着x轴还是Y轴移动
                // 判断是否要沿着x轴移动
                if(e2 > -dy)
                {
                    err -= dy;
                    x1 += sx;
                }
                // 判断是否要沿着y轴移动
                if (e2 < dx)
                {
                    err += dx;
                    y1 += sy;
                }
            }
        }
         
        static void DrawTriangle()
        {

        }

        static void DrawRectAngle(int x,int y,int width,int height)
        {
            //画出一条长
            DrawLine(x, y, x + width, y);
            DrawLine(x, y, x, y + height);
            DrawLine(x+width, y, x+width, y + height);
            DrawLine(x, y+height, x+width, y + height);
        }
    }
}
